/*
 * SEGUNDA ENTREGA DEL PROYECTO DE BASES DE DATOS "BIBLIOTECA DIGITAL"
 * 
 * Integrantes:
 * Gamboa Edwin Ricardo Cód: 0926631 plan: 2711
 * Portilla Cortes Maria Cristina Cód: 0844113 plan: 3743 
 * Rosero Rosero Luis Alberto Cód: 0943740 plan:3743
 * 
 */
package accesoDatos;

import java.sql.*;
import logica.*;
import java.util.*;

/**
 *
 * @author Gamboa Family
 */
public class DaoMaterial {

    FachadaBD fachada;

    public DaoMaterial(){
        fachada= new FachadaBD();
    }
    
    public void activarMaterial (String codigo){
        String actualizacion;
        
        actualizacion = "UPDATE material SET estado_material = '0' "
                + "WHERE codigo_material = \'"+ codigo + "\'";
        ejecutarUpdate(actualizacion);
        System.out.println(actualizacion);
    }
    
    public Vector<Material> consultaGeneral(Vector<String> entradaConsulta){        
        DaoTipoMaterial daoTipo = new DaoTipoMaterial();
        DaoUsuario daoUsr = new DaoUsuario();
        Vector<Material> resultado = new Vector();
        String seleccion = "material.codigo_material, descripcion_material, fecha_publicacion_material, "
                + "editorial_material , fecha_creacion_material, "
                + "titulo_principal_material, titulo_secundario_material, idioma_material,"
                + "fecha_catalogacion_material, formato_material, tipo_material, "
                + "id_catalogador, ruta_material, estado_material, tamano_material ";
        
        String consulta = "(SELECT " + seleccion 
                + "FROM material "
                + "WHERE titulo_principal_material ILIKE '%" 
                + entradaConsulta.firstElement() + "%' "
                + "OR titulo_secundario_material ILIKE '%" 
                + entradaConsulta.firstElement() + "%' ";
        
        for(int i=1; i <entradaConsulta.size(); i++){
            consulta+= "OR titulo_principal_material ILIKE '%" 
                    + entradaConsulta.elementAt(i) + "%' "
                    + "OR titulo_secundario_material ILIKE '%" 
                    + entradaConsulta.elementAt(i) + "%' ";
        }
        
        consulta += ") UNION (SELECT " + seleccion 
                + "FROM autor, material, autor_material "
                + "WHERE (autor.nombres_autor ILIKE '%"
                + entradaConsulta.firstElement() + "%' "
                + "OR autor.apellidos_autor ILIKE '%"
                + entradaConsulta.firstElement() + "%' ";
        
        for(int i=1; i <entradaConsulta.size(); i++){
            consulta+= "OR autor.nombres_autor ILIKE '%" 
                    + entradaConsulta.elementAt(i) + "%' "
                    + "OR autor.apellidos_autor ILIKE '%" 
                    + entradaConsulta.elementAt(i) + "%' ";
        }
        
        consulta += ") AND material.codigo_material= autor_material.codigo_material "
                + "AND autor.codigo_autor=autor_material.codigo_autor) "
                + "UNION (SELECT " + seleccion 
                + "FROM palabra_clave,material,palabra_material "
                + "WHERE (palabra_clave.nombre_palabra ILIKE '%"
                + entradaConsulta.firstElement() + "%' ";
        
        for(int i=1; i <entradaConsulta.size(); i++){
            consulta+= "OR palabra_clave.nombre_palabra ILIKE '%" 
                    + entradaConsulta.elementAt(i) + "%' ";
        } 
        consulta += ")AND material.codigo_material= palabra_material.codigo_material "
                + "AND palabra_clave.codigo_palabra=palabra_material.codigo_palabra)"
                + "ORDER BY titulo_principal_material ";
        System.out.print(consulta);
        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(consulta);
            
            while(tabla.next()){
                Material m = new Material();
                String codigo = tabla.getString(1);
                m.setCodigo(codigo);                
                m.setDescripcion(tabla.getString(2)); 
                m.setFecha_publicacion(tabla.getString(3));
                m.setEditorial(tabla.getString(4));
                m.setFecha_creacion(tabla.getString(5));
                m.setTitulo_pri(tabla.getString(6));
                m.setTitulo_sec(tabla.getString(7));
                m.setIdioma(tabla.getString(8));
                m.setFecha_catalogacion(tabla.getString(9));
                m.setFormato(tabla.getString(10));
                m.setTipo_mat(daoTipo.retornarTipoPorCodigo(tabla.getString(11)));
                m.setCatalogador(daoUsr.retornarUsuarioPorCodigo(tabla.getString(12)));
                m.setRuta(tabla.getString(13));
                m.setEstado(tabla.getString(14));
                m.setTamano(tabla.getString(15));
                m.setAutores(retornarAutores(codigo));
                m.setPalabras_clave(retornarPalabras(codigo));
                m.setAreas_comp(retornarAreas(codigo));
                resultado.addElement(m);
                System.out.println("Consulta General OK");                
            }
            conn.close();            
            return resultado;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
        return null;        
    }
    
    public Vector consultarMaterialPorTitulo(String titulo){
        Vector v = new Vector();
        DaoTipoMaterial daoTipo = new DaoTipoMaterial();
        DaoUsuario daoUsr = new DaoUsuario();
        String sql_select;
        sql_select="SELECT codigo_material, descripcion_material, fecha_publicacion_material, "
                + "editorial_material , fecha_creacion_material, "
                + "titulo_principal_material, titulo_secundario_material, idioma_material,"
                + "fecha_catalogacion_material, formato_material, tipo_material, "
                + "id_catalogador, ruta_material, estado_material, tamano_material "
                + "FROM material WHERE titulo_principal_material like '%" + titulo + "%' "
                + "OR titulo_secundario_material like '%" + titulo + "%'";
         try{
            Connection conn= fachada.conectar();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            //
            while(tabla.next()){
                Material m = new Material();
                String codigo = tabla.getString(1);
                m.setCodigo(codigo);                
                m.setDescripcion(tabla.getString(2)); 
                m.setFecha_publicacion(tabla.getString(3));
                m.setEditorial(tabla.getString(4));
                m.setFecha_creacion(tabla.getString(5));
                m.setTitulo_pri(tabla.getString(6));
                m.setTitulo_sec(tabla.getString(7));
                m.setIdioma(tabla.getString(8));
                m.setFecha_catalogacion(tabla.getString(9));
                m.setFormato(tabla.getString(10));
                m.setTipo_mat(daoTipo.retornarTipoPorCodigo(tabla.getString(11)));
                m.setCatalogador(daoUsr.retornarUsuarioPorCodigo(tabla.getString(12)));
                m.setRuta(tabla.getString(13));
                m.setEstado(tabla.getString(14));
                m.setTamano(tabla.getString(15));
                m.setAutores(retornarAutores(codigo));
                m.setPalabras_clave(retornarPalabras(codigo));
                m.setAreas_comp(retornarAreas(codigo));
                v.add(m);
            }            
            conn.close();            
            System.out.println("Conexion cerrada");
            return v;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
         return null;
    }
    
    public Vector consultarMaterialesPorCodigo(String cod){
        Vector v = new Vector();
        DaoTipoMaterial daoTipo = new DaoTipoMaterial();
        DaoUsuario daoUsr = new DaoUsuario();
        String sql_select;
        sql_select="SELECT codigo_material, descripcion_material, fecha_publicacion_material, "
                + "editorial_material , fecha_creacion_material, "
                + "titulo_principal_material, titulo_secundario_material, idioma_material,"
                + "fecha_catalogacion_material, formato_material, tipo_material, "
                + "id_catalogador, ruta_material, estado_material, tamano_material "
                + "FROM material WHERE codigo_material = '" + cod +"'";
         try{
            Connection conn= fachada.conectar();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            while(tabla.next()){
                Material m = new Material();
                String codigo = tabla.getString(1);
                m.setCodigo(codigo);                
                m.setDescripcion(tabla.getString(2)); 
                m.setFecha_publicacion(tabla.getString(3));
                m.setEditorial(tabla.getString(4));
                m.setFecha_creacion(tabla.getString(5));
                m.setTitulo_pri(tabla.getString(6));
                m.setTitulo_sec(tabla.getString(7));
                m.setIdioma(tabla.getString(8));
                m.setFecha_catalogacion(tabla.getString(9));
                m.setFormato(tabla.getString(10));
                m.setTipo_mat(daoTipo.retornarTipoPorCodigo(tabla.getString(11)));
                m.setCatalogador(daoUsr.retornarUsuarioPorCodigo(tabla.getString(12)));
                m.setRuta(tabla.getString(13));
                m.setEstado(tabla.getString(14));
                m.setTamano(tabla.getString(15));
                m.setAutores(retornarAutores(codigo));
                m.setPalabras_clave(retornarPalabras(codigo));
                m.setAreas_comp(retornarAreas(codigo));
                v.add(m);
            }            
            conn.close();            
            System.out.println("Conexion cerrada");
            return v;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
         return null;
    }
    
    public Vector consultarTodosLosMateriales(){
        DaoTipoMaterial daoTipo = new DaoTipoMaterial();
        DaoUsuario daoUsr = new DaoUsuario();
        Vector v = new Vector();
        String sql_select;
        sql_select="SELECT codigo_material, descripcion_material, fecha_publicacion_material, "
                + "editorial_material , fecha_creacion_material, "
                + "titulo_principal_material, titulo_secundario_material, idioma_material,"
                + "fecha_catalogacion_material, formato_material, tipo_material, "
                + "id_catalogador, ruta_material, estado_material, tamano_material "
                + "FROM material";
         try{
            Connection conn= fachada.conectar();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            while(tabla.next()){
                Material m = new Material();
                String codigo = tabla.getString(1);
                m.setCodigo(codigo);                
                m.setDescripcion(tabla.getString(2)); 
                m.setFecha_publicacion(tabla.getString(3));
                m.setEditorial(tabla.getString(4));
                m.setFecha_creacion(tabla.getString(5));
                m.setTitulo_pri(tabla.getString(6));
                m.setTitulo_sec(tabla.getString(7));
                m.setIdioma(tabla.getString(8));
                m.setFecha_catalogacion(tabla.getString(9));
                m.setFormato(tabla.getString(10));
                m.setTipo_mat(daoTipo.retornarTipoPorCodigo(tabla.getString(11)));
                m.setCatalogador(daoUsr.retornarUsuarioPorCodigo(tabla.getString(12)));
                m.setRuta(tabla.getString(13));
                m.setEstado(tabla.getString(14));
                m.setTamano(tabla.getString(15));
                m.setAutores(retornarAutores(codigo));
                m.setPalabras_clave(retornarPalabras(codigo));
                m.setAreas_comp(retornarAreas(codigo));
                v.add(m);
            }            
            conn.close();            
            System.out.println("Conexion cerrada");
            return v;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
         return null;
    }
    
    public int ejecutarUpdate(String insert){
        try{
            Connection conn= fachada.conectar();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(insert);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){ System.out.println(e); }
        catch(Exception e){ System.out.println(e); }
        return -1;
    }//Fin ejecutarInsert
        
    public void desactivarMaterial (String codigo){
        String actualizacion;
        
        actualizacion = "UPDATE material SET estado_material = '1' "
                + "WHERE codigo_material = \'"+ codigo + "\'";
        ejecutarUpdate(actualizacion);
        System.out.println(actualizacion);
    }
    
    public boolean esActivado(String cod_mat){
        String sql_select, estado="";
        boolean respuesta = true;
        sql_select="SELECT estado_material FROM material "
                + "WHERE codigo_material = '" + cod_mat + "'";
        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                estado = tabla.getString(1);           
            }
            if(estado.equals("1"))
                respuesta = false;
            
            conn.close();
            System.out.println("Consulta de si esta Activado Material Ok");           
         }
        catch(SQLException e){ System.out.println(e); }
        catch(Exception e){ System.out.println(e); }
        return respuesta; 
    }
    
    public boolean existeCodigo(String codigo){
        String sql_select, aux="";
        sql_select="SELECT codigo_material FROM material WHERE "
                + "codigo_material =\'" + codigo+ "\'";
        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                aux=tabla.getString(1);
                System.out.println(aux);
            }
            conn.close();            
         }
        catch(SQLException e){ System.out.println(e); }
        catch(Exception e){ System.out.println(e); }
        if(aux.equals(codigo))
            return true;
        else 
            return false;
    }
    
    public String fechaActual(){
        String sql_select= "SELECT CURRENT_DATE";
        String fechaActual="";
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                fechaActual=tabla.getString(1);
                System.out.println("Fecha Actual Ok");                
            }
            conn.close();
            return fechaActual;
         }
        catch(SQLException e){ System.out.println(e); }
        catch(Exception e){ System.out.println(e); }
        return null;
    }
    
    public void guardarAreaAgregada(String cod_area, String cod_mat){
        String sql_guardar;
        sql_guardar="INSERT INTO area_material(codigo_area, codigo_material) "
                + "VALUES ('" +
                cod_area + "', '" + cod_mat + "')";
        ejecutarUpdate(sql_guardar);                
    }
    
    public void guardarAutorAgregado(String cod_aut, String cod_mat){
        String sql_guardar;
        sql_guardar="INSERT INTO autor_material(codigo_autor, codigo_material) "
                    + "VALUES ('" +
                cod_aut + "', '" + cod_mat + "')";
        ejecutarUpdate(sql_guardar);                
    }
    
    public void guardarMaterial(Material doc){
        String sql_guardar;
        sql_guardar="INSERT INTO material(codigo_material, descripcion_material,"
                + "fecha_publicacion_material, editorial_material, fecha_creacion_material,"
                + "titulo_principal_material, titulo_secundario_material, idioma_material,"
                + "fecha_catalogacion_material, formato_material, tipo_material, id_catalogador, "
                + "ruta_material, estado_material, tamano_material ) "
                + "VALUES ('" +
                doc.getCodigo() + "', '" + doc.getDescripcion() + "', '" +
                doc.getFecha_publicacion() + "', '" + doc.getEditorial() + "', '" + 
                doc.getFecha_creacion() + "', '" + doc.getTitulo_pri() + "', '" + 
                doc.getTitulo_sec() + "', '" + doc.getIdioma() + "', '" + 
                fechaActual() + "', '" + doc.getFormato() + "', '" +
                doc.getTipo_mat().getCodigo() + "', '" + doc.getCatalogador().getCodigo() + "', '" +
                doc.getRuta() + "', '" + doc.getEstado() +  "', '" + doc.getTamano() + "')";
        
        ejecutarUpdate(sql_guardar);
        System.out.println(sql_guardar);
        
    }//fin guardar
      
    public void guardarPalabraAgregada(String cod_pal, String cod_mat){
        String sql_guardar;
        sql_guardar="INSERT INTO palabra_material(codigo_palabra, codigo_material) "
                    + "VALUES ('" +
                cod_pal + "', '" + cod_mat + "')";
        ejecutarUpdate(sql_guardar);                
    }    
    
    public void modificarMaterial (int caso, String cod_mat, String valor){
        String actualizacion;
        switch(caso){
            case 1:
                actualizacion = "UPDATE material SET titulo_principal_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 2:
               actualizacion = "UPDATE material SET titulo_secundario_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 3:
               actualizacion = "UPDATE material SET fecha_creacion_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 4:
               actualizacion = "UPDATE material SET fecha_publicacion_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 5:
               actualizacion = "UPDATE material SET idioma_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break; 
            case 6:
               actualizacion = "UPDATE material SET formato_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 7:
               actualizacion = "UPDATE material SET editorial_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 8:
               actualizacion = "UPDATE material SET descripcion_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 9:
               actualizacion = "UPDATE material SET tipo_material = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
            case 10:
               actualizacion = "UPDATE material SET id_catalogador = \'" + valor + "\' "
                + "WHERE codigo_material = \'"+ cod_mat + "\'";
                ejecutarUpdate(actualizacion);
                System.out.println(actualizacion);
                break;
        }
    } 
    
    public Material retornarMaterialPorCodigo(String codigo){
        Material m = new Material();
        DaoTipoMaterial daoTipo = new DaoTipoMaterial();
        DaoUsuario daoUsr = new DaoUsuario();
        String sql_select;
        sql_select="SELECT codigo_material, descripcion_material, fecha_publicacion_material, "
                + "editorial_material , fecha_creacion_material, "
                + "titulo_principal_material, titulo_secundario_material, idioma_material,"
                + "fecha_catalogacion_material, formato_material, tipo_material, "
                + "id_catalogador, ruta_material, estado_material, tamano_material " +
                "FROM material WHERE codigo_material =  '" + codigo +"'";
        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                m.setCodigo(tabla.getString(1));
                m.setDescripcion(tabla.getString(2)); 
                m.setFecha_publicacion(tabla.getString(3));
                m.setEditorial(tabla.getString(4));
                m.setFecha_creacion(tabla.getString(5));
                m.setTitulo_pri(tabla.getString(6));
                m.setTitulo_sec(tabla.getString(7));
                m.setIdioma(tabla.getString(8));
                m.setFecha_catalogacion(tabla.getString(9));
                m.setFormato(tabla.getString(10));
                m.setTipo_mat(daoTipo.retornarTipoPorCodigo(tabla.getString(11)));
                m.setCatalogador(daoUsr.retornarUsuarioPorCodigo(tabla.getString(12)));
                m.setRuta(tabla.getString(13));
                m.setEstado(tabla.getString(14));
                m.setTamano(tabla.getString(15));
                System.out.println("Material Ok");
            }
            conn.close();
            m.setAutores(retornarAutores(codigo));
            m.setPalabras_clave(retornarPalabras(codigo));
            m.setAreas_comp(retornarAreas(codigo));
            return m;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
        return null;
    }
    
    
    public Vector retornarAutores (String cod_mat){
        Vector autores = new Vector();
        DaoAutor daoAutor = new DaoAutor();
        String sql_select;
        sql_select="SELECT codigo_autor " + "FROM autor_material "
                + "WHERE codigo_material = '" + cod_mat +"'";        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                autores.add(daoAutor.retornarAutorPorCodigo(tabla.getString(1)));
                System.out.println("Autores de Material Ok");
            }
            conn.close();
            return autores;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
        return null;
    }
    
    public Vector retornarPalabras (String cod_mat){
        Vector palabras = new Vector();
        DaoPalabraClave daoPalabra = new DaoPalabraClave();
        String sql_select;
        sql_select="SELECT codigo_palabra " + "FROM palabra_material "
                + "WHERE codigo_material = '" + cod_mat +"'";        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                palabras.add(daoPalabra.retornarPalabraPorCodigo(tabla.getString(1)));
                System.out.println("Palabras de Material Ok");
            }
            conn.close();
            return palabras;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
        return null;
        
    }
    
   public Vector retornarAreas (String cod_mat){
        Vector areas = new Vector();
        DaoAreaConocimiento daoArea = new DaoAreaConocimiento();
        String sql_select;
        sql_select="SELECT codigo_area " + "FROM area_material "
                + "WHERE codigo_material = '" + cod_mat +"'";        
        try{
            Connection conn= fachada.conectar();
            System.out.println("consultando en la bd");
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next()){
                areas.add(daoArea.retornarAreaPorCodigo(tabla.getString(1)));
                System.out.println("Areas de Material Ok");
            }
            conn.close();
            return areas;
         }
         catch(SQLException e){ System.out.println(e); }
         catch(Exception e){ System.out.println(e); }
        return null;
    }
    
    public void quitarAutor(String cod_mat, String cod_autor){
        String borrado;
        borrado = "DELETE FROM autor_material WHERE codigo_material = '" + cod_mat +
                "' AND codigo_autor = '" + cod_autor +"'";
        ejecutarUpdate(borrado);
    }
    
    public void quitarPalabra(String cod_mat, String cod_palabra){
        String borrado;
        borrado = "DELETE FROM palabra_material WHERE codigo_material = '" + cod_mat +
                "' AND codigo_palabra = '" + cod_palabra+"'";
        ejecutarUpdate(borrado);
    }
    
    public void quitarArea(String cod_mat, String cod_area){
        String borrado;
        borrado = "DELETE FROM area_material WHERE codigo_material = '" + cod_mat +
                "' AND codigo_area = '" + cod_area+"'";
        ejecutarUpdate(borrado);
    }
    
}// Fin Clase

